package com.ydzt.fanka.server.main;

import java.io.IOException;
import java.sql.Connection;
import java.util.HashMap;

import org.apache.log4j.Logger;

import com.ydzt.fanka.server.domain.ParamDefine;
import com.ydzt.fanka.server.init.InitData;
import com.ydzt.fanka.server.init.SynchronizedVariable;
import com.ydzt.fanka.server.init.ThreadObjectPool;
import com.ydzt.fanka.server.space.consumer.SocketConsumerPool;
import com.ydzt.fanka.server.timer.AutoEndDayServer;
import com.ydzt.fanka.server.timer.DREndDayTimer;

public class SocketServer {
	static Logger logger = Logger.getLogger(SocketServer.class.getName());
	public static void main(String[] args) throws IOException {
		HashMap<String , ParamDefine> paramDefine = InitData.initParamDefine();	
		Connection conn = null;
		if(InitData.nodeType.equals("00")){
			SynchronizedVariable.getInstance().setBuffLock(false);
		}
		else if(!InitData.nodeType.equals("00")){
			SynchronizedVariable.getInstance().setBuffLock(true);
		}
		
		//buffer入队列
		ThreadObjectPool.bufferReceiverServer.start();
		
		//为食堂计算机
		if(!InitData.nodeType.equals("00")){
			ThreadObjectPool.transmitListenrServer.start();
			/*
			TransmitListenrServer transmitListenrServer = new TransmitListenrServer();
			transmitListenrServer.start();
			*/
			ThreadObjectPool.sendTransmitServer.start();
			/*
			SendTransmitServer sendTransmitServer = new SendTransmitServer();
			sendTransmitServer.start();
			*/
		}
		
		//食堂计算机 该定时器定时向中心发送2002报文 检查结算日期
		if(!InitData.nodeType.equals("00")){
			DREndDayTimer.autoEndDay();
		}
		
		//中心和食堂都有 广播
		ThreadObjectPool.broadCastServer.start();
		/*
		BroadCastServer broadCastServer = new BroadCastServer();
		broadCastServer.start();
		*/
		//检测日终命令
		/*
		EndDayServer endDayServer = new EndDayServer();
		endDayServer.start();
		*/
		
		/*
		 * 报文接收线程 
		 * */
		ThreadObjectPool.socketReceiverServer.start();
		/*
		SocketReceiverServer socketReceiverServer = new SocketReceiverServer();
		socketReceiverServer.start();
		*/
		//错误包处理 对error_pkg文件中的包进行处理 
		//将因为数据库断开而没有被处理的包全部移回buffer中 重新处理
		ThreadObjectPool.errServer.start();
		/*
		ErrServer errServer = new ErrServer();
		errServer.start();
		*/
		//对队列中未处理的包进行处理
		
		
		//消费者线程池  将队列中的报文解包入库 并进行具体的处理
		SocketConsumerPool.getInstans(10).initProcessPool(paramDefine,conn);
		
		
		//卡账户更新线程  食堂无此功能
		if(InitData.nodeType.equals("00")){
			ThreadObjectPool.zwclUpdateAccountServer.start();
			/*
			ZwclUpdateAccountServer zwclUpdateAccountServer = new ZwclUpdateAccountServer();
			zwclUpdateAccountServer.start();
			*/
		}
		
		//自动日终
		if(InitData.nodeType.equals("00")){
			AutoEndDayServer.endDay();
		}
	}
	
}
